-
Notifications
You must be signed in to change notification settings - Fork 2
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
FEAT: 상황에 따른 에러 핸들링 #16
Conversation
커스텀 에러 중 |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
수고하셨습니다! 코멘트 확인 부탁드립니다!
HANE24/Model/Error.swift
Outdated
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
만약 좀 더 발전시킨다면 에러가 일어나면 개발진 슬랙이나 이메일, 구글 스프레드에 바로 올려버리는 것도 좋아보이네요
let statusCode = (response as? HTTPURLResponse)?.statusCode | ||
guard statusCode == 200 else { | ||
try ErrorHandler.shared.errorFromHttpRequest(statusCode) | ||
throw CustomError.unknownError("\(statusCode)") |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
요 부분이 이해가 잘 안갑니다. 코드가 200이 아닌 경우 그 상태코드를 들고 다시 errorFormHttpRequest를 이용해서 커스텀 에러에 속해있는지를 파악하는 거라 생각합니다. 이 부분에서 catch를 사용하지 않는 이유가 궁금합니다.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
아뇨,errorFormHttpRequest를 이용해서 커스텀 에러에 속해있는지를 파악하는 것이 아닌 errorFormHttpRequest를 이용하여서 statuscode에 따라 발생한 에러를 custom 에러로 변환하는 과정입니다..! catch 후 에러를 핸들링 하는 과정을 한 곳에서 진행하는게 통일성 있을 듯 하여(요청한 vm class 내의 메서드에서) 해당 부분에서는 catch 하지 않고 다시 throw 후, 상위 메서드에서 catch 후 핸들링 하는 방식을 선택하였습니다. 만약 해당 request 메서드 내에서 catch 를 하게 되면, 상위 request를 호출한 메서드 내에서는 api request 시도에 실패하였다는 것을 알기 어려울 것 같습니다. 그렇게 될 경우, 요청 실패로인해 class내의 프로퍼티를 업데이트 하지 않아도 되는 경우에도 업데이트가 진행되는 등의 문제가 발생할 것 같습니다! 이와 같은이유로 다시 throw하게 처리하였는데 에러를 어디서 catch 하고 핸들링 하면 좋을지에 대해서는 추가적으로 고민해보겠습니다!
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
의도: 최상단으로 throw를 하기 위한 방법
의문: 책임의 소재
func verifyError(_ error: Error) async { | ||
switch error { | ||
case DecodingError.dataCorrupted: | ||
self.errorType = .decodeFailed | ||
case URLError.timedOut: | ||
self.errorType = .networkDisconnected | ||
case URLError.networkConnectionLost: | ||
self.errorType = .networkDisconnected | ||
case is CustomError: | ||
self.errorType = error as? CustomError ?? .none | ||
default: | ||
self.errorType = .unknownError(error.localizedDescription.description) | ||
} | ||
} |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
이 코드가 클라이언트 에러를 구분하는 책임을 맡은 만큼 함수 이름에서도 errorFromHttpRequest처럼 그 부분이 보였으면 좋겠습니다.
코멘트 감사합니다:) 잘못 이해하고 계신 부분이 있어 말씁드립니다!request 시점에 네트워크에 연결되지 않은 상태인 경우와 request에 대한 응답이 timeout인 경우 로그인 화면을 보여주는 것이 아닌 네트워크가 연결되어있지 않거나 상태가 좋지 않은 상황(timeout)에 대한 alert를 띄워주는 방식입니다 :) 로그인 화면으로 돌아가는 경우는 token이 만료된 경우, unauthorized 에러가 발생하는 경우 뿐입니다! |
Conflict만 해결해주시면 Approve 하겠습니다! |
@ittzggd 충돌 한번만 확인해주시면 바로 승인하겠습니다! |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
충돌 고치기가 역시 번거롭네요. 얼른 Tuist를 ㅠㅠ 수고하셨습니다!!
이슈 (번호도 함께 작성해주세요)
15
해당 사항 (중복 선택)
반영 브랜치
ex) feat/login -> dev
feat/errorHandler/2
변경 사항
ex) 로그인 시, 구글 소셜 로그인 기능을 추가했습니다.
CustomError enum
errorDescription
: 어떤 에러인지에 대한 내용을 담고있습니다recoverySuggestion
: 해당 에러에 따른 사용자의 이후 행동을 제시합니다ErrorHandler class
errorType: CustomError
: 상황에 맞는 에러로 set 됩니다. 아무에러도 발생하지 않은 경우 기본값은 .none으로 설정됩니다.showAlert: Bool
: 사용자에게 에러에 대한 정보를 담은 alert의 present 여부입니다.signInRequired: Bool
: 재로그인이 필요한 에러 발생시, 로그인뷰로의 전환 여부를 나타내는 변수입니다. 추후 해당 변수는 UserDefualt로 대체될 예정입니다.func errorFromHttpRequest(_ statusCode: Int?) throw
: 200...299 구간을 제외한 statusCode가 반환되는 경우, 각 코드에 맞는 CustomError의 case를 throw합니다.func verifyError(_ error: Error) async
: throw된 에러들을 타입에 따라 구분합니다func updateErrorView()
: 에러 타입에 따른 뷰 업데이트 여부 및 어떤 방식의 뷰 업데이트인지 판별합니다.###적용범위